package com.xiubai.appforpda.jack.utils.permissionUtils;

import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;


/**
 * Description:
 *
 * @author zhaozp
 * @since 2016-08-12
 */
public class AudioPermissionCheckUtils {
   private static final String TAG = "AudioPermissionCheckUt";

   // 音频获取源
   public static int audioSource = MediaRecorder.AudioSource.MIC;
   // 设置音频采样率，44100是目前的标准，但是某些设备仍然支持22050，16000，11025
   public static int sampleRateInHz = 44100;
   // 设置音频的录制的声道CHANNEL_IN_STEREO为双声道，CHANNEL_CONFIGURATION_MONO为单声道
   public static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
   // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
   public static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
   // 缓冲区字节大小
   public static int bufferSizeInBytes = 0;

   /**
    * 判断是是否有录音权限
    */
   public static boolean checkAudioPermission(final Context context) {
      bufferSizeInBytes = 0;
      bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
      AudioRecord audioRecord = null;
      try {
         audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat,
             bufferSizeInBytes);
      } catch (Exception e) {
         e.printStackTrace();
         return false;
      }
      //开始录制音频
      try {
         // 防止某些手机崩溃，例如联想
         audioRecord.startRecording();
      } catch (IllegalStateException e) {
         e.printStackTrace();
         Log.e(TAG, Log.getStackTraceString(e));
      }
      /**
       * 根据开始录音判断是否有录音权限
       */
      if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING
          && audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
         Log.e(TAG,
             "audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING : " + audioRecord
                 .getRecordingState());
         return false;
      }

      if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED) {
         //如果短时间内频繁检测，会造成audioRecord还未销毁完成，此时检测会返回RECORDSTATE_STOPPED状态，再去read，会读到0的size，所以此时默认权限通过
         return true;
      }

      byte[] bytes = new byte[1024];
      int readSize = audioRecord.read(bytes, 0, 1024);
      if (readSize == AudioRecord.ERROR_INVALID_OPERATION || readSize <= 0) {
         Log.e(TAG, "readSize illegal : " + readSize);
         return false;
      }
      if (audioRecord != null) {
         audioRecord.stop();
         audioRecord.release();
         audioRecord = null;
      }
      return true;
   }

   public static boolean getRecordState() {
      int minBuffer = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO,
          AudioFormat.ENCODING_PCM_16BIT);
      AudioRecord audioRecord = null;
      try {
         audioRecord =
             new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 44100, AudioFormat.CHANNEL_IN_MONO,
                 AudioFormat.ENCODING_PCM_16BIT, (minBuffer * 100));
      } catch (Exception e) {
         e.printStackTrace();
         return false;
      }

      short[] point = new short[minBuffer];
      int readSize = 0;
      try {
         audioRecord.startRecording();//检测是否可以进入初始化状态
      } catch (Exception e) {
         if (audioRecord != null) {
            audioRecord.release();
            audioRecord = null;
         }
         return false;
      }
      if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
         //6.0以下机型都会返回此状态，故使用时需要判断bulid版本
         //检测是否在录音中
         if (audioRecord != null) {
            audioRecord.stop();
            audioRecord.release();
            audioRecord = null;
         }
         return false;
      } else {
         //检测是否可以获取录音结果

         readSize = audioRecord.read(point, 0, point.length);
         if (readSize <= 0) {
            if (audioRecord != null) {
               audioRecord.stop();
               audioRecord.release();
               audioRecord = null;
            }
            return false;
         } else {
            if (audioRecord != null) {
               audioRecord.stop();
               audioRecord.release();
               audioRecord = null;
            }

            return true;
         }
      }
   }
}
